<?php
/**
 * 支付 管理
 *
 * @author    Alex Xun xunzhibin@expert.com
 * @version   1.0
 * @copyright (C) 2018 Jnexpert Ltd. All rights reserved
 * @file      .\pay\controller\v1\Pay.php
 */

namespace app\pay\controller\v1;

use controller\BasicWechat;
use think\Loader;
use app\common\qrcode\Code AS QrCode;

/**
 * 支付 控制器类
 *
 * @author Alex Xun xunzhibin@jnexpert.com
 * @package controller
 */
class Pay extends BasicWechat
{
    /**
     * 公众号 第三方库 初始化
     *
     * 根据具体所需服务，实例不同的接口类
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    protected function initVendor()
    {
        // 实例化 第三方库
        $this->wechat = new \WeChat\Pay($this->config);
    }

    /**
     * 支付
     *
     * 更具不同支付方式，发起不同支付
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    public function index()
    {
        // 支付方式
        $config = [
            'js' => 'h5', // 微信端 H5 支付
            'product' => 'product',// 扫码支付(模式一) 商品码
            'code' => 'code', // 扫码支付(模式二) 支付码
        ];

        // 检查
        if(
            ! isset($this->data['pay_method'])
            || ! $this->data['pay_method']
            || ! isset($config[$this->data['pay_method']])
        ) {
            // 缺少参数 || 参数为空 || 支付方式不存在
            throw new \think\exception\ValidateException('Not exist -- [pay_method]');
        }

        // 支付方式 相对应 函数
        $function = $config[$this->data['pay_method']];
        unset($this->data['pay_method']);

        // 支付
        return $this->$function();
    }

    /**
     * H5 支付
     *
     * 移动端网页使用微信支付，发起本地服务呼起微信客户端进行支付
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     */
    protected function h5()
    {
        // 网页端接口请求参数列表
        $result = $this->wechat->createParamsForJsApi($this->data['prepay_id']);

        // 响应
        return $this->response($result, true);
    }

    /**
     * 扫码支付(模式一) 产品码
     *
     * 根据规定格式生成二维码。用户扫码，微信支付系统调用支付回调URL，
     * 商户根据相关参数生成商户订单，调用微信统一下单API，
     * 并将prepay_id返回给微信支付系统。
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     **/
    protected function product()
    {
        // 创建链接
        $code_url = $this->wechat->createParamsForRuleQrc(
            $this->data['product_id']
        );

        // 创建 二维码
        $qrcode = new QrCode();
        $result = $qrcode->create([
            'content' => $code_url,
            'size' => isset($this->data['size']) ? $this->data['size'] : 200
        ]);

        return $this->response([
            'qrcode' => $result
        ], true);
    }

    /**
     * 扫码支付(模式二) 支付码
     *
     * 先调用微信支付的统一下单接口，微信支付系统返回链接参数code_url，
     * 商户将code_url值生成二维码图片，用户使用微信客户端扫码后发起支付。
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     **/
    protected function code()
    {
        // 二维码大小 默认 200
        $qrcode_size = 200;
        if(isset($this->data['size']) && $this->data['size']) {
            $qrcode_size = $this->data['size'];
        }


        // 生成 二维码
        $qrcode = new QrCode();
        $result = $qrcode->create([
            'content' => $this->data['code_url'],
            'size' => $qrcode_size
        ]);

        return $this->response([
            'qrcode' => $result
        ], true);
    }
}
